package impl;

import anaydis.sort.SorterType;
import org.jetbrains.annotations.NotNull;

import java.util.Comparator;
import java.util.List;

public class ShellSorter extends HSorter{

    private int[] secuencia;

    public ShellSorter(int[] secuencia){
        super(SorterType.SHELL);
        this.secuencia = secuencia;
    }
   public <T> void sort(Comparator<T> tComparator, List<T> ts) {
        secuencia = checkSecuencia(ts, secuencia);
        for(int i = secuencia.length-1; i>-1; i--){
            sort(tComparator, ts, secuencia[i]);
        }
    }

    private <T> int[] checkSecuencia(List<T> ts, int[] secuencia){
        int i = 0;
        while(ts.size()/secuencia[i] > 1){
            i++;
            if(i==secuencia.length){
                int[] aux = new int[secuencia.length+1];
                System.arraycopy(secuencia, 0, aux, 0, secuencia.length);
                aux[aux.length-1] = aux[aux.length-2]*3;
                secuencia = aux;
            }
        }
        if(secuencia.length>8){
            return secuencia;
        }else{
            int[] aux = new int[i];
            System.arraycopy(secuencia, 0, aux, 0, i);
            return aux;
        }
    }
    
    @NotNull
    public SorterType getType() {
        return SorterType.SHELL;
    }
}
